package solutions.ferpa.ztest.ent;

import java.sql.*;
import java.util.ArrayList;
import br.com.telescope.adsrt.dom.*;
import br.com.telescope.adsrt.lib.*;
import br.com.telescope.t2.exception.Severity;
import br.com.telescope.util.JdbcUtil;

/**
 * API de persistência de dados da entidade INSTRUCAO_TRABALHO
 * @author Gerado pelo Telescope
 */
public class EntInstrucaoTrabalho extends Entity {
    
    public final static String ENTITY_NAME = "ZTEST.INSTRUCAO_TRABALHO";
    public final static String TABLE_NAME = "INSTRUCAO_TRABALHO";
    
    // <editor-fold defaultstate="collapsed" desc="Contrutores e inicializacao">
    /**
     * Construtores
     */
    public EntInstrucaoTrabalho() {
        super();
        initialize();
    }
    
    public EntInstrucaoTrabalho(BaseRuntime ctx) {
        super();
        initialize(ctx);
    }
    
    @Override
    public String getPrimaryKeyColumn() {
        return "ID";
    }
    
    @Override
    public void initialize(BaseRuntime ctx) {
        super.initialize(ctx);
        initialize();
    }
    
    public void initialize() {
        aId = new DomId(this,"ID", "Id"); 
        aId.setRequired(true);
        oId = new DomId();
        aNome = new DomUpper(this,"NOME", "Nome da instrução"); 
        aNome.setRequired(true);
        aNome.setSize(32);
        oNome = new DomUpper();
        aTitulo = new DomText(this,"TITULO", "Título da instrução"); 
        aTitulo.setRequired(true);
        aTitulo.setSize(64);
        oTitulo = new DomText();
        aRevisao = new DomInteger(this,"REVISAO", "Revisão da instrução"); 
        aRevisao.setRequired(true);
        oRevisao = new DomInteger();
        aElaboradoPorId = new DomId(this,"ELABORADO_POR_ID", "Elaborado por"); 
        aElaboradoPorId.setRequired(true);
        oElaboradoPorId = new DomId();
        aDataElaboracao = new DomDate(this,"DATA_ELABORACAO", "Data da elaboração"); 
        oDataElaboracao = new DomDate();
        aAprovadoPorId = new DomId(this,"APROVADO_POR_ID", "Aprovado por"); 
        oAprovadoPorId = new DomId();
        aDataAprovacao = new DomDate(this,"DATA_APROVACAO", "Data da aprovação"); 
        oDataAprovacao = new DomDate();
        aSituacao = new DomOption(this,"SITUACAO", "Situação da instrução de trabalho"); 
        aSituacao.setRequired(true);
        aSituacao.setSize(1);
        aSituacao.clearOptions();
        aSituacao.addOption("G", "Aguardando aprovação");
        aSituacao.addOption("A", "Aprovada");
        aSituacao.addOption("D", "Descontinuada");
        aSituacao.addOption("E", "Em elaboração");
        aSituacao.setDefaultValue("E");
        oSituacao = new DomOption();
        aDataDescontinuacao = new DomDate(this,"DATA_DESCONTINUACAO", "Data (instrução descontinuada)"); 
        oDataDescontinuacao = new DomDate();
        aMotivoDescontinuarInstrucao = new DomTextLong(this,"MOTIVO_DESCONTINUAR_INSTRUCAO", "Motivo (descontinuar instrução)"); 
        aMotivoDescontinuarInstrucao.setSize(512);
        oMotivoDescontinuarInstrucao = new DomTextLong();
        aPlanoExecucaoId = new DomId(this,"PLANO_EXECUCAO_ID", "Plano de execução"); 
        aPlanoExecucaoId.setRequired(true);
        oPlanoExecucaoId = new DomId();
        ressetModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributos da entidade">
    
    // Id
    private DomId aId;
    private DomId oId;
    
    // Nome da instrução
    private DomUpper aNome;
    private DomUpper oNome;
    
    // Título da instrução
    private DomText aTitulo;
    private DomText oTitulo;
    
    // Revisão da instrução
    private DomInteger aRevisao;
    private DomInteger oRevisao;
    
    // Elaborado por
    private DomId aElaboradoPorId;
    private DomId oElaboradoPorId;
    
    // Data da elaboração
    private DomDate aDataElaboracao;
    private DomDate oDataElaboracao;
    
    // Aprovado por
    private DomId aAprovadoPorId;
    private DomId oAprovadoPorId;
    
    // Data da aprovação
    private DomDate aDataAprovacao;
    private DomDate oDataAprovacao;
    
    // Situação da instrução de trabalho
    private DomOption aSituacao;
    private DomOption oSituacao;
    
    // Data (instrução descontinuada)
    private DomDate aDataDescontinuacao;
    private DomDate oDataDescontinuacao;
    
    // Motivo (descontinuar instrução)
    private DomTextLong aMotivoDescontinuarInstrucao;
    private DomTextLong oMotivoDescontinuarInstrucao;
    
    // Plano de execução
    private DomId aPlanoExecucaoId;
    private DomId oPlanoExecucaoId;
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ID">
    
    public EntInstrucaoTrabalho id(Long value) {
        setId(value);
        return this;
    }
    
    public void setId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyId();
        } else {
            aId.setValue(value.getValue());
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(String value) {
        if (value == null) {
            nullifyId();
        } else {
            aId.setValue(value);
            if (aId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setId(Long value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void setId(Object value) {
        aId.setValue(value);
        if (aId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyId() {
        if (!aId.isNull()) {
            aId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getId() {
        return aId;
    }
    
    public DomId oldId() {
        return oId;
    }
    
    public Long valueOfId() {
        return aId.getValue();
    }
    
    public boolean isIdModified() {
        return aId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo NOME">
    
    public EntInstrucaoTrabalho nome(String value) {
        setNome(value);
        return this;
    }
    
    public void setNome(DomUpper value) {
        if (value == null || value.isNull()) {
            nullifyNome();
        } else {
            aNome.setValue(value.getValue());
            if (aNome.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setNome(String value) {
        if (value == null) {
            nullifyNome();
        } else {
            aNome.setValue(value);
            if (aNome.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setNome(Object value) {
        aNome.setValue(value);
        if (aNome.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyNome() {
        if (!aNome.isNull()) {
            aNome.setNull(true);
            setModified(true);
        }
    }
    
    public DomUpper getNome() {
        return aNome;
    }
    
    public DomUpper oldNome() {
        return oNome;
    }
    
    public String valueOfNome() {
        return aNome.getValue();
    }
    
    public boolean isNomeModified() {
        return aNome.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo TITULO">
    
    public EntInstrucaoTrabalho titulo(String value) {
        setTitulo(value);
        return this;
    }
    
    public void setTitulo(DomText value) {
        if (value == null || value.isNull()) {
            nullifyTitulo();
        } else {
            aTitulo.setValue(value.getValue());
            if (aTitulo.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTitulo(String value) {
        if (value == null) {
            nullifyTitulo();
        } else {
            aTitulo.setValue(value);
            if (aTitulo.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setTitulo(Object value) {
        aTitulo.setValue(value);
        if (aTitulo.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyTitulo() {
        if (!aTitulo.isNull()) {
            aTitulo.setNull(true);
            setModified(true);
        }
    }
    
    public DomText getTitulo() {
        return aTitulo;
    }
    
    public DomText oldTitulo() {
        return oTitulo;
    }
    
    public String valueOfTitulo() {
        return aTitulo.getValue();
    }
    
    public boolean isTituloModified() {
        return aTitulo.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo REVISAO">
    
    public EntInstrucaoTrabalho revisao(Integer value) {
        setRevisao(value);
        return this;
    }
    
    public void setRevisao(DomInteger value) {
        if (value == null || value.isNull()) {
            nullifyRevisao();
        } else {
            aRevisao.setValue(value.getValue());
            if (aRevisao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setRevisao(String value) {
        if (value == null) {
            nullifyRevisao();
        } else {
            aRevisao.setValue(value);
            if (aRevisao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setRevisao(Integer value) {
        aRevisao.setValue(value);
        if (aRevisao.isModified()) {
            setModified(true);
        }
    }
    
    public void setRevisao(Object value) {
        aRevisao.setValue(value);
        if (aRevisao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyRevisao() {
        if (!aRevisao.isNull()) {
            aRevisao.setNull(true);
            setModified(true);
        }
    }
    
    public DomInteger getRevisao() {
        return aRevisao;
    }
    
    public DomInteger oldRevisao() {
        return oRevisao;
    }
    
    public Integer valueOfRevisao() {
        return aRevisao.getValue();
    }
    
    public boolean isRevisaoModified() {
        return aRevisao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo ELABORADO_POR_ID">
    
    public EntInstrucaoTrabalho elaboradoPorId(Long value) {
        setElaboradoPorId(value);
        return this;
    }
    
    public void setElaboradoPorId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyElaboradoPorId();
        } else {
            aElaboradoPorId.setValue(value.getValue());
            if (aElaboradoPorId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setElaboradoPorId(String value) {
        if (value == null) {
            nullifyElaboradoPorId();
        } else {
            aElaboradoPorId.setValue(value);
            if (aElaboradoPorId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setElaboradoPorId(Long value) {
        aElaboradoPorId.setValue(value);
        if (aElaboradoPorId.isModified()) {
            setModified(true);
        }
    }
    
    public void setElaboradoPorId(Object value) {
        aElaboradoPorId.setValue(value);
        if (aElaboradoPorId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyElaboradoPorId() {
        if (!aElaboradoPorId.isNull()) {
            aElaboradoPorId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getElaboradoPorId() {
        return aElaboradoPorId;
    }
    
    public DomId oldElaboradoPorId() {
        return oElaboradoPorId;
    }
    
    public Long valueOfElaboradoPorId() {
        return aElaboradoPorId.getValue();
    }
    
    public boolean isElaboradoPorIdModified() {
        return aElaboradoPorId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo DATA_ELABORACAO">
    
    public EntInstrucaoTrabalho dataElaboracao(java.sql.Date value) {
        setDataElaboracao(value);
        return this;
    }
    
    public void setDataElaboracao(DomDate value) {
        if (value == null || value.isNull()) {
            nullifyDataElaboracao();
        } else {
            aDataElaboracao.setValue(value.getValue());
            if (aDataElaboracao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataElaboracao(String value) {
        if (value == null) {
            nullifyDataElaboracao();
        } else {
            aDataElaboracao.setValue(value);
            if (aDataElaboracao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataElaboracao(java.sql.Date value) {
        aDataElaboracao.setValue(value);
        if (aDataElaboracao.isModified()) {
            setModified(true);
        }
    }
    
    public void setDataElaboracao(Object value) {
        aDataElaboracao.setValue(value);
        if (aDataElaboracao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyDataElaboracao() {
        if (!aDataElaboracao.isNull()) {
            aDataElaboracao.setNull(true);
            setModified(true);
        }
    }
    
    public DomDate getDataElaboracao() {
        return aDataElaboracao;
    }
    
    public DomDate oldDataElaboracao() {
        return oDataElaboracao;
    }
    
    public java.sql.Date valueOfDataElaboracao() {
        return aDataElaboracao.getValue();
    }
    
    public boolean isDataElaboracaoModified() {
        return aDataElaboracao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo APROVADO_POR_ID">
    
    public EntInstrucaoTrabalho aprovadoPorId(Long value) {
        setAprovadoPorId(value);
        return this;
    }
    
    public void setAprovadoPorId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyAprovadoPorId();
        } else {
            aAprovadoPorId.setValue(value.getValue());
            if (aAprovadoPorId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setAprovadoPorId(String value) {
        if (value == null) {
            nullifyAprovadoPorId();
        } else {
            aAprovadoPorId.setValue(value);
            if (aAprovadoPorId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setAprovadoPorId(Long value) {
        aAprovadoPorId.setValue(value);
        if (aAprovadoPorId.isModified()) {
            setModified(true);
        }
    }
    
    public void setAprovadoPorId(Object value) {
        aAprovadoPorId.setValue(value);
        if (aAprovadoPorId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyAprovadoPorId() {
        if (!aAprovadoPorId.isNull()) {
            aAprovadoPorId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getAprovadoPorId() {
        return aAprovadoPorId;
    }
    
    public DomId oldAprovadoPorId() {
        return oAprovadoPorId;
    }
    
    public Long valueOfAprovadoPorId() {
        return aAprovadoPorId.getValue();
    }
    
    public boolean isAprovadoPorIdModified() {
        return aAprovadoPorId.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo DATA_APROVACAO">
    
    public EntInstrucaoTrabalho dataAprovacao(java.sql.Date value) {
        setDataAprovacao(value);
        return this;
    }
    
    public void setDataAprovacao(DomDate value) {
        if (value == null || value.isNull()) {
            nullifyDataAprovacao();
        } else {
            aDataAprovacao.setValue(value.getValue());
            if (aDataAprovacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataAprovacao(String value) {
        if (value == null) {
            nullifyDataAprovacao();
        } else {
            aDataAprovacao.setValue(value);
            if (aDataAprovacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataAprovacao(java.sql.Date value) {
        aDataAprovacao.setValue(value);
        if (aDataAprovacao.isModified()) {
            setModified(true);
        }
    }
    
    public void setDataAprovacao(Object value) {
        aDataAprovacao.setValue(value);
        if (aDataAprovacao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyDataAprovacao() {
        if (!aDataAprovacao.isNull()) {
            aDataAprovacao.setNull(true);
            setModified(true);
        }
    }
    
    public DomDate getDataAprovacao() {
        return aDataAprovacao;
    }
    
    public DomDate oldDataAprovacao() {
        return oDataAprovacao;
    }
    
    public java.sql.Date valueOfDataAprovacao() {
        return aDataAprovacao.getValue();
    }
    
    public boolean isDataAprovacaoModified() {
        return aDataAprovacao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo SITUACAO">
    
    public EntInstrucaoTrabalho situacao(String value) {
        setSituacao(value);
        return this;
    }
    
    public void setSituacao(DomOption value) {
        if (value == null || value.isNull()) {
            nullifySituacao();
        } else {
            aSituacao.setValue(value.getValue());
            if (aSituacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSituacao(String value) {
        if (value == null) {
            nullifySituacao();
        } else {
            aSituacao.setValue(value);
            if (aSituacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setSituacao(Object value) {
        aSituacao.setValue(value);
        if (aSituacao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifySituacao() {
        if (!aSituacao.isNull()) {
            aSituacao.setNull(true);
            setModified(true);
        }
    }
    
    public DomOption getSituacao() {
        return aSituacao;
    }
    
    public DomOption oldSituacao() {
        return oSituacao;
    }
    
    public String valueOfSituacao() {
        return aSituacao.getValue();
    }
    
    public boolean isSituacaoModified() {
        return aSituacao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo DATA_DESCONTINUACAO">
    
    public EntInstrucaoTrabalho dataDescontinuacao(java.sql.Date value) {
        setDataDescontinuacao(value);
        return this;
    }
    
    public void setDataDescontinuacao(DomDate value) {
        if (value == null || value.isNull()) {
            nullifyDataDescontinuacao();
        } else {
            aDataDescontinuacao.setValue(value.getValue());
            if (aDataDescontinuacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataDescontinuacao(String value) {
        if (value == null) {
            nullifyDataDescontinuacao();
        } else {
            aDataDescontinuacao.setValue(value);
            if (aDataDescontinuacao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setDataDescontinuacao(java.sql.Date value) {
        aDataDescontinuacao.setValue(value);
        if (aDataDescontinuacao.isModified()) {
            setModified(true);
        }
    }
    
    public void setDataDescontinuacao(Object value) {
        aDataDescontinuacao.setValue(value);
        if (aDataDescontinuacao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyDataDescontinuacao() {
        if (!aDataDescontinuacao.isNull()) {
            aDataDescontinuacao.setNull(true);
            setModified(true);
        }
    }
    
    public DomDate getDataDescontinuacao() {
        return aDataDescontinuacao;
    }
    
    public DomDate oldDataDescontinuacao() {
        return oDataDescontinuacao;
    }
    
    public java.sql.Date valueOfDataDescontinuacao() {
        return aDataDescontinuacao.getValue();
    }
    
    public boolean isDataDescontinuacaoModified() {
        return aDataDescontinuacao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo MOTIVO_DESCONTINUAR_INSTRUCAO">
    
    public EntInstrucaoTrabalho motivoDescontinuarInstrucao(String value) {
        setMotivoDescontinuarInstrucao(value);
        return this;
    }
    
    public void setMotivoDescontinuarInstrucao(DomTextLong value) {
        if (value == null || value.isNull()) {
            nullifyMotivoDescontinuarInstrucao();
        } else {
            aMotivoDescontinuarInstrucao.setValue(value.getValue());
            if (aMotivoDescontinuarInstrucao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setMotivoDescontinuarInstrucao(String value) {
        if (value == null) {
            nullifyMotivoDescontinuarInstrucao();
        } else {
            aMotivoDescontinuarInstrucao.setValue(value);
            if (aMotivoDescontinuarInstrucao.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setMotivoDescontinuarInstrucao(Object value) {
        aMotivoDescontinuarInstrucao.setValue(value);
        if (aMotivoDescontinuarInstrucao.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyMotivoDescontinuarInstrucao() {
        if (!aMotivoDescontinuarInstrucao.isNull()) {
            aMotivoDescontinuarInstrucao.setNull(true);
            setModified(true);
        }
    }
    
    public DomTextLong getMotivoDescontinuarInstrucao() {
        return aMotivoDescontinuarInstrucao;
    }
    
    public DomTextLong oldMotivoDescontinuarInstrucao() {
        return oMotivoDescontinuarInstrucao;
    }
    
    public String valueOfMotivoDescontinuarInstrucao() {
        return aMotivoDescontinuarInstrucao.getValue();
    }
    
    public boolean isMotivoDescontinuarInstrucaoModified() {
        return aMotivoDescontinuarInstrucao.isModified();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Atributo PLANO_EXECUCAO_ID">
    
    public EntInstrucaoTrabalho planoExecucaoId(Long value) {
        setPlanoExecucaoId(value);
        return this;
    }
    
    public void setPlanoExecucaoId(DomId value) {
        if (value == null || value.isNull()) {
            nullifyPlanoExecucaoId();
        } else {
            aPlanoExecucaoId.setValue(value.getValue());
            if (aPlanoExecucaoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setPlanoExecucaoId(String value) {
        if (value == null) {
            nullifyPlanoExecucaoId();
        } else {
            aPlanoExecucaoId.setValue(value);
            if (aPlanoExecucaoId.isModified()) {
                setModified(true);
            }
        }
    }
    
    public void setPlanoExecucaoId(Long value) {
        aPlanoExecucaoId.setValue(value);
        if (aPlanoExecucaoId.isModified()) {
            setModified(true);
        }
    }
    
    public void setPlanoExecucaoId(Object value) {
        aPlanoExecucaoId.setValue(value);
        if (aPlanoExecucaoId.isModified()) {
            setModified(true);
        }
    }
    
    public void nullifyPlanoExecucaoId() {
        if (!aPlanoExecucaoId.isNull()) {
            aPlanoExecucaoId.setNull(true);
            setModified(true);
        }
    }
    
    public DomId getPlanoExecucaoId() {
        return aPlanoExecucaoId;
    }
    
    public DomId oldPlanoExecucaoId() {
        return oPlanoExecucaoId;
    }
    
    public Long valueOfPlanoExecucaoId() {
        return aPlanoExecucaoId.getValue();
    }
    
    public boolean isPlanoExecucaoIdModified() {
        return aPlanoExecucaoId.isModified();
    }
    // </editor-fold>
    // </editor-fold>
    
    @Override
    protected void processDeleteCascade() throws AdsException {
        // Delete cascade ZTEST.ITEM_INSTRUCAO.FK_ITMINS_INSTRUCAO_TRABALHO
        {
            EntItemInstrucao itemInstrucao = new EntItemInstrucao(ctx);
            itemInstrucao.del("select id from ITEM_INSTRUCAO where INSTRUCAO_TRABALHO_ID = " + valueOfId());
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="getErrors">
    /**
     * Traduz um erro recebido do banco de dados para um AdsException
     */
    @Override
    public AdsException getErrors(String errorMsg, int transaction) {
        AdsException e;
        String msg = errorMsg.toUpperCase();
        
        if (transaction == DELETE_TRANSACTION) {
            e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.GET_ERRORS_UNKNOWN",
                    AdsException.UNKNOWN,
                    "Erro não esperado: " + errorMsg);
        } else {
            if (msg.indexOf("FK_INSTRA_PLANO_EXECUCAO") >= 0) {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.FK_INSTRA_PLANO_EXECUCAO", 
                        Severity.ERROR,
                        "Registro não cadastrado para PLANO_EXECUCAO! (FK_INSTRA_PLANO_EXECUCAO)");
                return e;
            } else if (msg.indexOf("FK_INSTRA_APROVADO_POR") >= 0) {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.FK_INSTRA_APROVADO_POR", 
                        Severity.ERROR,
                        "Registro não cadastrado para APROVADO_POR! (FK_INSTRA_APROVADO_POR)");
                return e;
            } else if (msg.indexOf("FK_INSTRA_ELABORADO_POR") >= 0) {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.FK_INSTRA_ELABORADO_POR", 
                        Severity.ERROR,
                        "Registro não cadastrado para ELABORADO_POR! (FK_INSTRA_ELABORADO_POR)");
                return e;
            } else if (msg.indexOf("UK_INSTRA_NOME") >= 0) {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.UK_INSTRA_NOME", 
                        Severity.ERROR,
                        "Registro duplicado! Nome do manual da instruções de trabalho deve ser único. Nome da instrução ${NOME} (UK_INSTRA_NOME)");
                return e;
            } else if (msg.indexOf("PK_INSTRA") >= 0) {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.PK_INSTRA", 
                        Severity.ERROR,
                        "ID duplicado! (PK_INSTRA)");
                return e;
            } else {
                e = new AdsException("ZTEST.INSTRUCAO_TRABALHO.GET_ERRORS_UNKNOWN",
                        AdsException.UNKNOWN,
                        "Erro não esperado: " + errorMsg);
            }
        }
        return e;
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Entity Information">
    
    public String getEntityName() {
        return ENTITY_NAME;
    }
    
    public String getTableName() {
        return TABLE_NAME;
    }
    
    public String idSequenceName() {
        return "PK_SEQUENCE";
    }
    
    private ArrayList<Field> allAttributes;
    public ArrayList<Field> getAllAttributes() {
        if (allAttributes == null) {
            allAttributes = new ArrayList<Field>();
            allAttributes.add(aId);
            allAttributes.add(aNome);
            allAttributes.add(aTitulo);
            allAttributes.add(aRevisao);
            allAttributes.add(aElaboradoPorId);
            allAttributes.add(aDataElaboracao);
            allAttributes.add(aAprovadoPorId);
            allAttributes.add(aDataAprovacao);
            allAttributes.add(aSituacao);
            allAttributes.add(aDataDescontinuacao);
            allAttributes.add(aMotivoDescontinuarInstrucao);
            allAttributes.add(aPlanoExecucaoId);
        }
        return allAttributes;
    }
    
    /**
     * Retorna o valor da primeira UK da entidade
     * Se ela for composta, retorna a concatenação de toda a combinação
     * de atributos separados por um espaço.
     */
    public String valueOfUk() {
        return getNome().toString();
    }
    // </editor-fold>
    
    // <editor-fold defaultstate="collapsed" desc="Relationships">
    
    
    public void findByNome(String nome) throws AdsException {
        findBy(new String[] {"NOME"},
                new Object[] {nome});
    }
    
    private EntPlanoExecucao ePlanoExecucao;
    
    public EntPlanoExecucao findPlanoExecucao() throws AdsException {
        if (getPlanoExecucaoId().isNull()) {
            return null;
        }
        if (ePlanoExecucao == null || !valueOfPlanoExecucaoId().equals(ePlanoExecucao.valueOfId())) {
            ePlanoExecucao = new EntPlanoExecucao(ctx);
            ePlanoExecucao.find(valueOfPlanoExecucaoId());
        }
        return ePlanoExecucao;
    }
    
    /**
     * Ativa o join desta entidade com PLANO_EXECUCAO
     * através do atributo PLANO_EXECUCAO_ID
     */
    public EntPlanoExecucao joinPlanoExecucao() {
        return joinPlanoExecucao(null);
    }
    public EntPlanoExecucao joinPlanoExecucao(String alias) {
        EntPlanoExecucao entity = new EntPlanoExecucao(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getPlanoExecucaoId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByPlanoExecucao(long id, String sqlAppend) throws AdsException {
        find("select ID from INSTRUCAO_TRABALHO where PLANO_EXECUCAO_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByPlanoExecucao(long id) throws AdsException {
        findByPlanoExecucao(id,"");
    }
    
    public void findByPlanoExecucao(Entity entidade) throws AdsException {
        findByPlanoExecucao(entidade.valueOfId(),"");
    }
    
    public void findByPlanoExecucao(Entity entidade, String sqlAppend) throws AdsException {
        findByPlanoExecucao(entidade.valueOfId(),sqlAppend);
    }
    
    private EntPessoa eAprovadoPor;
    
    public EntPessoa findAprovadoPor() throws AdsException {
        if (getAprovadoPorId().isNull()) {
            return null;
        }
        if (eAprovadoPor == null || !valueOfAprovadoPorId().equals(eAprovadoPor.valueOfId())) {
            eAprovadoPor = new EntPessoa(ctx);
            eAprovadoPor.find(valueOfAprovadoPorId());
        }
        return eAprovadoPor;
    }
    
    /**
     * Ativa o join desta entidade com PESSOA
     * através do atributo APROVADO_POR_ID
     */
    public EntPessoa joinAprovadoPor() {
        return joinAprovadoPor(null);
    }
    public EntPessoa joinAprovadoPor(String alias) {
        EntPessoa entity = new EntPessoa(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getAprovadoPorId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByAprovadoPor(long id, String sqlAppend) throws AdsException {
        find("select ID from INSTRUCAO_TRABALHO where APROVADO_POR_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByAprovadoPor(long id) throws AdsException {
        findByAprovadoPor(id,"");
    }
    
    public void findByAprovadoPor(Entity entidade) throws AdsException {
        findByAprovadoPor(entidade.valueOfId(),"");
    }
    
    public void findByAprovadoPor(Entity entidade, String sqlAppend) throws AdsException {
        findByAprovadoPor(entidade.valueOfId(),sqlAppend);
    }
    
    private EntPessoa eElaboradoPor;
    
    public EntPessoa findElaboradoPor() throws AdsException {
        if (getElaboradoPorId().isNull()) {
            return null;
        }
        if (eElaboradoPor == null || !valueOfElaboradoPorId().equals(eElaboradoPor.valueOfId())) {
            eElaboradoPor = new EntPessoa(ctx);
            eElaboradoPor.find(valueOfElaboradoPorId());
        }
        return eElaboradoPor;
    }
    
    /**
     * Ativa o join desta entidade com PESSOA
     * através do atributo ELABORADO_POR_ID
     */
    public EntPessoa joinElaboradoPor() {
        return joinElaboradoPor(null);
    }
    public EntPessoa joinElaboradoPor(String alias) {
        EntPessoa entity = new EntPessoa(ctx);
        if (alias != null) {
            entity.setAlias(alias);
        }
        Join newJoin = new Join(getElaboradoPorId(), entity);
        entity.setJoinedBy(newJoin);
        this.join(newJoin);
        return entity;
    }
    
    public void findByElaboradoPor(long id, String sqlAppend) throws AdsException {
        find("select ID from INSTRUCAO_TRABALHO where ELABORADO_POR_ID = ? " + sqlAppend);
        sqlSetLong(1,id);
    }
    
    public void findByElaboradoPor(long id) throws AdsException {
        findByElaboradoPor(id,"");
    }
    
    public void findByElaboradoPor(Entity entidade) throws AdsException {
        findByElaboradoPor(entidade.valueOfId(),"");
    }
    
    public void findByElaboradoPor(Entity entidade, String sqlAppend) throws AdsException {
        findByElaboradoPor(entidade.valueOfId(),sqlAppend);
    }
    
    /**
     * Limpa os objetos normalizados da entidade
     */
    public void clearRelatedObjects() {
        ePlanoExecucao = null;
        eAprovadoPor = null;
        eElaboradoPor = null;
    }
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo INSTRUCAO_TRABALHO_ID
     */
    public EntItemInstrucao findAllItemInstrucaoInstrucaoTrabalho() throws AdsException {
        return findAllItemInstrucaoInstrucaoTrabalho("order by ID");
    }
    
    /**
     * Retorna os registros de ITEM_INSTRUCAO que referenciam este registro através do atributo INSTRUCAO_TRABALHO_ID
     */
    public EntItemInstrucao findAllItemInstrucaoInstrucaoTrabalho(String sqlAppend) throws AdsException {
        EntItemInstrucao out = new EntItemInstrucao(ctx);
        out.find("select ID from ITEM_INSTRUCAO where INSTRUCAO_TRABALHO_ID = " + valueOfId() + " " + sqlAppend);
        return out;
    }
    
    
    /**
     * Método que copia os valores dos atributos
     * para os valores respectivos old 
     */
    public void saveOldAtributes() {
        oPlanoExecucaoId.setValue(aPlanoExecucaoId);
        oMotivoDescontinuarInstrucao.setValue(aMotivoDescontinuarInstrucao);
        oTitulo.setValue(aTitulo);
        oDataDescontinuacao.setValue(aDataDescontinuacao);
        oSituacao.setValue(aSituacao);
        oDataAprovacao.setValue(aDataAprovacao);
        oAprovadoPorId.setValue(aAprovadoPorId);
        oDataElaboracao.setValue(aDataElaboracao);
        oElaboradoPorId.setValue(aElaboradoPorId);
        oRevisao.setValue(aRevisao);
        oNome.setValue(aNome);
        oId.setValue(aId);
    }
    
    /**
     * Método que retorna as regras da entidade
     * @return ArrayList com as regras ou null caso não existir nenhuma regra
     */
    public ArrayList getAllRules() {
        ArrayList<EntityRule> out = new ArrayList<EntityRule>();
        {
            PrimaryKeyRule rule = new PrimaryKeyRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setName("PK_INSTRA");
            rule.setPkAttribute(new DomId("ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setAssociatedEntity(EntPessoa.class);
            rule.setName("FK_INSTRA_APROVADO_POR");
            rule.addAttribute(new DomId("APROVADO_POR_ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setAssociatedEntity(EntPessoa.class);
            rule.setName("FK_INSTRA_ELABORADO_POR");
            rule.addAttribute(new DomId("ELABORADO_POR_ID",""));
            out.add(rule);
        }
        {
            ForeignKeyRule rule = new ForeignKeyRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setAssociatedEntity(EntPlanoExecucao.class);
            rule.setName("FK_INSTRA_PLANO_EXECUCAO");
            rule.addAttribute(new DomId("PLANO_EXECUCAO_ID",""));
            out.add(rule);
        }
        {
            UniqueKeyRule rule = new UniqueKeyRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setName("UK_INSTRA_NOME");
            rule.addAttribute(new DomUpper("NOME",""));
            out.add(rule);
        }
        {
            AllowableValuesRule rule = new AllowableValuesRule();
            rule.setEntity(EntInstrucaoTrabalho.class);
            rule.setCheckAttribute(new DomOption("SITUACAO",""));
            rule.setName("CKAV_20304177");
            rule.addAllowableValues(new String[] {"E", "G", "A", "D"});
            out.add(rule);
        }
        return out;
    }
    // </editor-fold>
    
    @Override
    protected void preInsert() throws AdsException {
        calcularSituacaoInstrucao(); //Calcular situação da instrução
    }
    
    @Override
    protected void preUpdate() throws AdsException {
        calcularSituacaoInstrucao(); //Calcular situação da instrução
    }
    
    @Override
    protected void posUpdate() throws AdsException {
        recalcularNomeItensInstrucao(); //Recalcular nome dos itens da instrução
    }
    
    @Override
    public void fillDefaultValues() throws AdsException {
        if (aId.isNull()) {
            aId.setValue("" + ctx.getNextVal("pk_sequence"));
        }
        if (getSituacao().isNull()) {
            setSituacao(getSituacao().getDefaultValue());
        }
    }
    
    // <editor-fold defaultstate="collapsed" desc="Métodos customizados">
    
    /**
     * Regra de ação: Recalcular nome dos itens da instrução
     */
    private void recalcularNomeItensInstrucao() throws AdsException {
        // <user-code id="20738963" parentId="20738937" hashcode="5a5ed5b3" length="379">
        // import br.com.telescope.util.JdbcUtil;
        
        if (isNomeModified()) {
            EntItemInstrucao item = new EntItemInstrucao(ctx);
            item.filterBy()
                    .equal(item.getInstrucaoTrabalhoId(), valueOfId().longValue())
                    .isNull(item.getItemInstrucaoPaiId());
        
            while (item.next()) {
                item.calcularSiglaIdentificacaoItem();
            }
            item.close();
        }
        // </user-code>
    }
    
    /**
     * Regra de ação: Calcular situação da instrução
     * 
     * Situação da instrução:
     * * se data elaboração informada, situação = G (aguardando aprovação)
     * * se data aprovação informada, situação = A (aprovada)
     * * se data descontinuação informada, situação = D (descontinuado)
     */
    private void calcularSituacaoInstrucao() throws AdsException {
        // <user-code id="20304355" parentId="20304244" hashcode="-155f3c80" length="1075">
        if (isDataDescontinuacaoModified()) {
            if (getDataDescontinuacao().isNotNull()) {
                setSituacao("D");
                nullifyDataAprovacao();
                return;
            }
        }
        if (isDataElaboracaoModified()) {
            if (getDataElaboracao().isNotNull()) {
                setSituacao("G");
                nullifyDataDescontinuacao();
                return;
            }
        }
        if (isDataAprovacaoModified()) {
            if (getDataAprovacao().isNotNull()) {
                int qtdeItens = ctx.computeSqlInteger(
                        "select count(*)"
                        + " from item_instrucao itin"
                        + " where itin.instrucao_trabalho_id = ?",
                        0,
                        valueOfId()
                        );
                if (qtdeItens > 0) {
                    setSituacao("A");
                    nullifyDataDescontinuacao();
                } else {
                    ctx.pushError(ENTITY_NAME,
                            Severity.ERROR,
                            "Instrução incompleta! Cadastre os itens da instrução antes de aprová-la.");
                }
            } else {
                setSituacao("G");
                nullifyDataDescontinuacao();
            }
        }
        // </user-code>
    }
}
